perm filename FILES.SAI[JLG,SYS] blob sn#811655 filedate 1986-03-02 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00013 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	BEGOF("FILES")
C00003 00003	IFK PASSONE THENK
C00004 00004	IFK PASSONE THENK
C00006 00005	IFSITE TENEX THENK
C00007 00006	IFSITE  CMUVER THENK
C00008 00007	IFK PASSONE THENK
C00013 00008	IFSITE TENEX THENK TES 10/25/73 
C00014 00009	IFSITE TENEX THENK
C00015 00010	IFSITE TENEX THENK
C00017 00011	IFK PASSONE THENK
C00018 00012	IFSITE TENEX THENK
C00020 00013	FINISHED
C00021 ENDMK
C⊗;
BEGOF("FILES")

COMMENT

      *** Variations at Different Sites for Most Procedures ***

Processing of input file names and opening of input files is
installation-dependent.  Most of the options are handled by a single
routine called OPENTOREAD.

Output file opening is simpler and handled by WRITEON.
;

IFC TENEX THENC
DEFINE CHANGE(A,B)= [IF NULSTR(A) AND FULSTR(B) THEN B ELSE 0];
ELSEC
DEFINE CHANGE(A,B)= [IF A=0 THEN B ELSE 0];
ENDC

PROCEDURES
IFK PASSONE THENK
PUBLIC SIMPLE PROCEDURE FILES! ;$"#
BEGIN "FILES!"
THISFILE ← "(NO FILE)" ;
MAINFILE ← INFILE ;
END "FILES!" ;
ENDC
IFK PASSONE THENK
PUBLIC SIMPLE PROCEDURE FINIFILES ;$"#
BEGIN "FINIFILES"
IF GENREXT THEN OUTFILE ← OUTFILE &
    IFC CMUVER THENC (IF ABS(DEVICE)=XGP THEN ".XGO" ELSE ".DOC") ENDC
COMMENT changed by jlg 8/20/85 to include a prepress extension
    IFC SAILVER THENC (IF ABS(DEVICE)=XGP THEN ".XGP" ELSE ".DOC") ENDC ;
    IFC SAILVER THENC (IF ABS(DEVICE)=XGP THEN ".XGP" ELSE
                         IF Abs(Device) = MIC THEN ".PRE" ELSE ".DOC") ENDC
    IFCR PARCVER THENC PARCEXT ENDC
    IFC ISIVER THENC (IF ABS(DEVICE)=XGP THEN ".XGO" ELSE ".DOC") ENDC	RT01 10/25/74;
    IFC ITSVER THENC DOCEXT ENDC;	PJ 5/27/74;
END "FINIFILES" ;
ENDC
IFSITE TENEX THENK
PRIVATE SITE(TENEX) STRING SIMPLE PROCEDURE CVFIL(STRING FILENAME; REFERENCE STRING EXT, PPN) ;$"#
	BEGIN
	STRING NAME ;
	PPN ← IF FILENAME[1 FOR 1] = "<" THEN SCANTO(">", FILENAME, TRUE) ELSE NULL ;
	NAME ← SCANTO(".;", FILENAME, FALSE) ;
	EXT ← IF FILENAME[1 FOR 1] = "." THEN SCANTO(";", FILENAME, FALSE) ELSE NULL ;
	RETURN(NAME) ;
	END ;
ENDC
IFSITE  CMUVER THENK
PRIVATE SITE(CMUVER) STRING SIMPLE PROCEDURE CVPPN(INTEGER VALUE) ;$"#
BEGIN "CVPPN"
OWN SAFE INTEGER ARRAY A[0:1];
INTEGER ERRSW;
STRING S;
DEFINE CALLI="'47000000000",	DECCMU="-3";

IF VALUE = 0 THEN RETURN (NULL);

A[0]←A[1]←0;
START!CODE
    SETZM 0,ERRSW;
    MOVE 1,A;
    HRLI 1,VALUE;
    CALLI 1,DECCMU;
    SETOM 0,ERRSW;
END;

RETURN ("["&
	(  IF ERRSW THEN (CVOS(VALUE LSH -18)&","&CVOS(VALUE LAND '777777))
		    ELSE (CVSTR(A[0])&CVSTR(A[1])[1 FOR 3])  )
	& "]");

END "CVPPN";
ENDC
IFK PASSONE THENK
PUBLIC INTEGER PROCEDURE OPENTOREAD(INTEGER MODE ;
	STRING FILEKIND ; REFERENCE STRING FILENAME;
	IFC TENEX THENC STRING ELSEC INTEGER ENDC EXTDEFAULT, PPNDEFAULT) ;$"#
BEGIN TES 8/24/74 PROCEDURIZED ;
label labeltogetaroundcompilerbug;
INTEGER CHAN, C ; BOOLEAN GOTIT ;
IFC TENEX THENC STRING ELSEC INTEGER ENDC  FEXT, FPPN, EXTD, PPNI, PPND, NAME, EXT, PPN ;
STRING NF ;
STRING INDEVICE ;	RKJ: 5-17-74 ;
SETBREAK(LOCAL!TABLE,":",NULL,"IS");
IF (CHAN←GETCHAN)<0 THEN EARLYWARNING("NO CHANNELS ARE LEFT FOR INPUT!") ;
EOF ← 0 ;
GOTIT ← FALSE ;
DO  BEGIN "NAMELOOP"
	RKJ: 6-FEB-75 MOVED NEX THREE LINES INSIDE LOOP;
	INDEVICE←SCAN(FILENAME,LOCAL!TABLE,DUMMY);
	IF NULSTR(FILENAME) THEN BEGIN FILENAME←INDEVICE; INDEVICE←"DSK" END ;
	OPEN(CHAN,INDEVICE,MODE, 2,0,150,BRC,EOF);
     	NAME ← CVFIL(FILENAME, FEXT, FPPN) ;
	FOR C ← 0 THRU 5 DO
	    BEGIN
	    EXT ← FEXT ; PPN ← FPPN ;
	    CASE C OF
	        BEGIN "LKPCASES"
	    	BEGIN END ;
	    	IF (EXTD←EXT←CHANGE(FEXT, EXTDEFAULT)) = 0 THEN CONTINUE ;
	    	IF (PPNI←PPN←CHANGE(FPPN, INPPN)) = 0 THEN CONTINUE ;
	    	IF (EXT←EXTD) = 0 OR (PPN←PPNI) = 0 THEN CONTINUE ;
	    	IF (PPND←PPN←CHANGE(FPPN, PPNDEFAULT)) = 0 THEN CONTINUE ;
	    	IF (EXT←EXTD)=0 OR (PPN←PPND)=0 THEN CONTINUE ;
	        END "LKPCASES" ;
	    GOTIT ← XLOOKUP(CHAN,NAME,EXT,0,PPN);
	    IF GOTIT THEN DONE ;
	    END ;
	IF GOTIT THEN DONE ;
	IFC PARCVER THENC  TES 10/21/74 SO FONT 2 "SERIF" WORKS ;
	IF FILEKIND[1 TO 4] = "Font" AND FULSTR(NF←FONTEQUIV(NAME)) THEN
		FILENAME ← NF ELSE
	ENDC
	BEGIN
	IF NOT SWDBACK THEN OUTSTR(CRLF) ; SWDBACK ← TRUE ;
	OUTSTR(FILEKIND & FILENAME & " not found." & CRLF & "Read file: ");
	IFC TENEX THENC
		RELEASE(CHAN);
		OUTSTR(PPND←PPNDEFAULT) ;
		DO	BEGIN  TES 10/22/74 ;
			CHAN ← GTJFNL(PPND,'162000000000,'100000101,
				NULL,PPNDEFAULT[2 TO ∞-1],
				NAME,EXTDEFAULT[2 TO ∞],
				NULL, NULL, NULL) ;
			IF CHAN>-1 THEN DONE ;
			OUTSTR("XXX"&CRLF&"Read file: ") ; PPND←NULL ;
			END
		UNTIL FALSE ;
		SETINPUT(CHAN,150,BRC,EOF) ; TES 10/16/74 ;
		OPENF(CHAN, 2) ;
		DONE ;
	ELSEC
		FILENAME ← INCHWL ;
		IFC CMUVER THENC
		  IF NULSTR(FILENAME) THEN FILENAME←"NULL:EMPTY";
		ENDC RKJ: 6-FEB-75;
	ENDC
	END ;
    END "NAMELOOP"
UNTIL GOTIT ;
labeltogetaroundcompilerbug:
IFC TENEX THENC  TES 4/13/75 ;
IF FILEKIND[1 TO 4] = "Font" THEN
	FILENAME ← JFNS(CHAN, '211100000001) ELSE
ENDC
FILENAME ← UNCVFIL(CHAN, NAME, EXT, PPN) ;
RETURN(CHAN) ;
END "OPENTOREAD" ;
ENDC
IFSITE TENEX THENK TES 10/25/73 ;
PRIVATE SITE(TENEX) STRING PROCEDURE SCANTO(STRING BRKS; REFERENCE STRING SCANNEE; BOOLEAN INCLUDE) ;$"#
	BEGIN
	INTEGER DUMMY ;
	SETBREAK(LOCAL!TABLE, BRKS, NULL, IF INCLUDE THEN "IA" ELSE "IR") ;
	RETURN(SCAN(SCANNEE, LOCAL!TABLE, DUMMY)) ;
	END ;
ENDC
IFSITE TENEX THENK
PUBLIC SITE(TENEX) SIMPLE PROCEDURE SFBSZ(INTEGER CHAN, SIZE) ;$"#
	BEGIN "SFBSZ"
	INTEGER K ;
	DEFINE JSYS=['104000000000], SFBSZ=[JSYS '46];
	K ← CVJFN(CHAN) ;
	START!CODE "BYTE16"
	MOVE 1,K; MOVE 2,SIZE; SFBSZ ;
	END "BYTE16" ;
	END "SFBSZ" ;
ENDC
IFSITE TENEX THENK
PUBLIC SITE(TENEX) SIMPLE STRING PROCEDURE UNCVFIL(INTEGER CHAN; STRING NAME, EXT, PPN) ;$"#
	RETURN(JFNS(CHAN, 0)) ;
ENDC

IFK PASSONE OR PASSTWO THENK
IFSITE NOT TENEX THENK
PUBLIC SITE(NOT TENEX) SIMPLE STRING PROCEDURE UNCVFIL(INTEGER CHAN, NAME, EXT, PPN) ;$"#
BEGIN
IFC ITSVER THENC PJ 11/9/74 I DON'T LIKE TRAILING SPACES OF SYSTEM CVXSTR ;
    SIMPLE STRING PROCEDURE CVXSTR(INTEGER SIXBIT);
	BEGIN
	STRING RETSTR;
	SIMPLE INTEGER PROCEDURE CHAR(REFERENCE INTEGER A);
	    START!CODE
	    MOVEI 1,0;
	    MOVE 2,A;
	    LSHC 1,6;
	    MOVEM 2,A;
	    ADDI 1,'40;
	    END;

	RETSTR←NULL;
	WHILE SIXBIT NEQ 0 DO RETSTR←RETSTR&CHAR(SIXBIT);
	RETURN(RETSTR)
	END ;
ENDC
RETURN(
	IFC SAILVER THENC
		CV6STR(NAME) &
		(IF EXT=0 THEN NULL ELSE "." & CV6STR(EXT)[1 TO 3]) &
		(IF PPN=0 THEN NULL ELSE "[" & CVXSTR(PPN)[1 TO 3] &
			"," & CVXSTR(PPN)[4 TO 6] & "]")
	ENDC
	IFC CMUVER THENC
		CVXSTR(NAME) &
		(IF EXT=0 THEN NULL ELSE "." & CVXSTR(EXT)[1 TO 3]) &
		CVPPN(PPN)
	ENDC
	IFC ITSVER THENC PJ 11/7/74 ;
		(IF PPN=0 THEN NULL ELSE CVXSTR(PPN)&";")&CVXSTR(NAME)&" "&CVXSTR(EXT)
	ENDC
    ) ;
END;
ENDC
ENDC
IFK PASSONE THENK
PUBLIC INTEGER SIMPLE PROCEDURE WRITEON(BOOLEAN BINARY; STRING FILENAME) ;$"#
BEGIN "WRITEON"
INTEGER CH ;
IF (CH ← GETCHAN) < 0 THEN
	BEGIN
	WARN("=",<"No channel for writing "&FILENAME>);
	RETURN(-1) ;
	END ;
K ← 0 ; OPEN(CH, "DSK", IF BINARY THEN 8 ELSE 0, 0, 2, DUMMY, DUMMY, K) ;
ENTER(CH, FILENAME, DUMMY←0) ;
IF DUMMY THEN WARN("=","ENTER failed for "&FILENAME);
RETURN(CH) ;
END "WRITEON" ;
ENDC
IFSITE TENEX THENK
PUBLIC SITE(TENEX) BOOLEAN SIMPLE PROCEDURE XLOOKUP(INTEGER CHAN; STRING NAME, EXT; INTEGER JUNK; STRING PPN) ;$"#
	BEGIN COMMENT RETURNS TRUE IF SUCCESSFUL ;
	BOOLEAN FLAG ;
	LOOKUP(CHAN, PPN & NAME & EXT, FLAG) ;
	RETURN(NOT FLAG) ;
	END ;
ENDC

IFK PASSONE THENK
IFSITE NOT TENEX THENK
PUBLIC SITE(NOT TENEX) BOOLEAN SIMPLE PROCEDURE XLOOKUP(INTEGER CHAN, NAME, EXT, JUNK, PPN) ;$"#
START!CODE "XLOOKUP"
    MOVE 2,CHAN;
    LSH 2,23;
IFC ITSVER
    THENC IOR 2,['027017777774] PJ 5/28/74 ;
    ELSEC IOR 2,['076017777774] ENDC ; COMMENT LOOKUP 0,-4(17) ;
    SETO 1,0; COMMENT TRUE ;
    XCT 0,2;
    SETZ 1,0; COMMENT FALSE ;
END "XLOOKUP";
ENDC
ENDC
FINISHED

ENDOF("FILES")